<?php
//支付宝类
class Alipay
{
	protected $alipay_config=array();//存储配置

      //初始化
      public function __construct($alipay_config=array())
      {
            /* *
             * 配置文件
             * 版本：3.3
             * 日期：2012-07-19
             */
            $alipay_config['partner']=isset($alipay_config['partner'])?$alipay_config['partner']:'';//合作身份者id，以2088开头的16位纯数字
            $alipay_config['key']=isset($alipay_config['key'])?$alipay_config['key']:'';//安全检验码，以数字和字母组成的32位字符
            
            $alipay_config['sign_type']=isset($alipay_config['sign_type'])?$alipay_config['sign_type']:strtoupper('MD5');//签名方式 不需修改
            $alipay_config['input_charset']=isset($alipay_config['input_charset'])?$alipay_config['input_charset']:strtolower('utf-8');//字符编码格式 目前支持 gbk 或 utf-8
            $alipay_config['transport']=isset($alipay_config['transport'])?$alipay_config['transport']:'http';//访问模式,根据自己的服务器是否支持ssl访问，若支持请选择https；若不支持请选择http

            $alipay_config['cacert']    = dirname(__FILE__).'/alipay/cacert.pem'; //ca证书路径地址，用于curl中ssl校验，请保证cacert.pem文件在当前文件夹目录中

            $alipay_config['seller_email']=isset($alipay_config['seller_email'])?$alipay_config['seller_email']:'';//签约支付宝账号或卖家支付宝帐户
            $alipay_config['return_url']=isset($alipay_config['return_url'])?$alipay_config['return_url']:'return_url';//页面跳转同步通知页面路径，要用 http://格式的完整路径，不允许加?id=123这类自定义参数
            $alipay_config['notify_url']=isset($alipay_config['notify_url'])?$alipay_config['notify_url']:'notify_url';//服务器异步通知页面路径，要用 http://格式的完整路径，不允许加?id=123这类自定义参数

            $this->alipay_config=$alipay_config;
  }   
      /* *
       * 功能：标准双接口接入页
       * 版本：3.3
       * 修改日期：2012-07-23
       * 说明：
       * 以下代码只是为了方便商户测试而提供的样例代码，商户可以根据自己网站的需要，按照技术文档编写,并非一定要使用该代码。
       * 该代码仅供学习和研究支付宝接口使用，只是提供一个参考。

       *************************注意*************************
       * 如果您在接口集成过程中遇到问题，可以按照下面的途径来解决
       * 1、商户服务中心（https://b.alipay.com/support/helperApply.htm?action=consultationApply），提交申请集成协助，我们会有专业的技术工程师主动联系您协助解决
       * 2、商户帮助中心（http://help.alipay.com/support/232511-16307/0-16307.htm?sh=Y&info_type=9）
       * 3、支付宝论坛（http://club.alipay.com/read-htm-tid-8681712.html）
       * 如果不想使用扩展功能请把扩展功能参数赋空值。
       */
      public function alipayto($data)
      {
            require_once(dirname(__FILE__)."/alipay/alipay_submit.class.php");

            $parameter = array(
            "service"             => "trade_create_by_buyer",
            "payment_type"        => "1", //支付类型 必填，不能修改
            
            "partner"             => trim($this->alipay_config['partner']),
            "_input_charset"      => trim(strtolower($this->alipay_config['input_charset'])),
            "seller_email"        => trim($this->alipay_config['seller_email']),
            "return_url"          => trim($this->alipay_config['return_url']),
            "notify_url"          => trim($this->alipay_config['notify_url']),

            "out_trade_no"        => $data['out_trade_no'],    //请与贵网站订单系统中的唯一订单号匹配
            "subject"             => $data['subject'],         //订单名称，显示在支付宝收银台里的“商品名称”里，显示在支付宝的交易管理的“商品名称”的列表里。
            "body"                => $data['body'],            //订单描述、订单详细、订单备注，显示在支付宝收银台里的“商品描述”里
            "price"               => number_format($data['price'],2),           //订单总金额，显示在支付宝收银台里的“应付总额”里
            "quantity"            => $data['quantity'],        //商品数量，建议默认为1，不改变值，把一次交易看成是一次下订单而非购买一件商品。
            
            "logistics_fee"       => number_format($data['logistics_fee'],2),//物流费用，即运费 0.00。
            "logistics_type"      => $data['logistics_type'],//物流类型，三个值可选：EXPRESS（快递）、POST（平邮）、EMS（EMS）
            "logistics_payment"   => $data['logistics_payment'],//物流支付方式，两个值可选：SELLER_PAY（卖家承担运费）、BUYER_PAY（买家承担运费）
            
            "receive_name"        => $data['receive_name'],    //收货人姓名，如：张三
            "receive_address"     => $data['receive_address'], //收货人地址，如：XX省XXX市XXX区XXX路XXX小区XXX栋XXX单元XXX号
            "receive_zip"         => $data['receive_zip'],     //收货人邮编，如：123456
            "receive_phone"       => $data['receive_phone'],   //收货人电话号码，如：0571-81234567
            "receive_mobile"      => $data['receive_mobile'],  //收货人手机号码，如：13312341234
            
            "show_url"            => $show_url//网站商品的展示地址，不允许加?id=123这类自定义参数
            );


            //建立请求
            $alipaySubmit = new AlipaySubmit($this->alipay_config);
            return $alipaySubmit->buildRequestForm($parameter,"get", "确认");
      }

      /* *
       * 功能：确认发货接口接入页
       * 版本：3.3
       * 修改日期：2012-07-23
       * 说明：
       * 以下代码只是为了方便商户测试而提供的样例代码，商户可以根据自己网站的需要，按照技术文档编写,并非一定要使用该代码。
       * 该代码仅供学习和研究支付宝接口使用，只是提供一个参考。

       *************************注意*************************
       * 如果您在接口集成过程中遇到问题，可以按照下面的途径来解决
       * 1、商户服务中心（https://b.alipay.com/support/helperApply.htm?action=consultationApply），提交申请集成协助，我们会有专业的技术工程师主动联系您协助解决
       * 2、商户帮助中心（http://help.alipay.com/support/232511-16307/0-16307.htm?sh=Y&info_type=9）
       * 3、支付宝论坛（http://club.alipay.com/read-htm-tid-8681712.html）
       * 如果不想使用扩展功能请把扩展功能参数赋空值。
       */

      public function delivery($data)
      {
            require_once(dirname(__FILE__)."/alipay/alipay_submit.class.php");

            $parameter = array(
            "service" => "send_goods_confirm_by_platform",
            "partner" => trim($this->alipay_config['partner']),
            "trade_no"  => $data['trade_no'],//支付宝交易号
            "logistics_name"  => $data['logistics_name'],//物流名称
            "invoice_no"      => $data['invoice_no'],//物流发货单号
            "transport_type"  => 'EXPRESS',//物流运输类型
            "_input_charset"  => trim(strtolower($alipay_config['input_charset']))
            );

            //建立请求
            $alipaySubmit = new AlipaySubmit($this->alipay_config);
            return $alipaySubmit->buildRequestHttp($parameter);
      }
//https://mapi.alipay.com/gateway.do?_input_charset=utf-8&logistics_payment=SELLER_PAY&logistics_type=EXPRESS&notify_url=http%3A%2F%2F127.0.0.1%2Fuser%2Findex.php%2Frecharge_asyn.html&out_trade_no=1372754134.3402&partner=2088302247819255&payment_type=1&price=5435&quantity=1&return_url=http%3A%2F%2F127.0.0.1%2Fuser%2Findex.php%2Findex_syn.html&seller_email=349865361%40qq.com&service=trade_create_by_buyer&subject=%E5%9C%A8%E7%BA%BF%E5%85%85%E5%80%26%2365533%3B&sign=345ed09eb893679f8c6350bf453f6d2f&sign_type=MD5
      /* *
       * 功能：支付宝服务器异步通知页面
       * 版本：3.3
       * 日期：2012-07-23

        *************************页面功能说明*************************
       * 创建该页面文件时，请留心该页面文件中无任何HTML代码及空格。
       * 该页面不能在本机电脑测试，请到服务器上做测试。请确保外部可以访问该页面。
       * 该页面调试工具请使用写文本函数logResult，该函数已被默认关闭，见alipay_notify_class.php中的函数verifyNotify
       * 如果没有收到该页面返回的 success 信息，支付宝会在24小时内按一定的时间策略重发通知
       
       * 如何判断该笔交易是通过即时到帐方式付款还是通过担保交易方式付款？
       * 
       * 担保交易的交易状态变化顺序是：等待买家付款→买家已付款，等待卖家发货→卖家已发货，等待买家收货→买家已收货，交易完成
       * 即时到帐的交易状态变化顺序是：等待买家付款→交易完成
       * 
       * 每当收到支付宝发来通知时，就可以获取到这笔交易的交易状态，并且商户需要利用商户订单号查询商户网站的订单数据，
       * 得到这笔订单在商户网站中的状态是什么，把商户网站中的订单状态与从支付宝通知中获取到的状态来做对比。
       * 如果商户网站中目前的状态是等待买家付款，而从支付宝通知获取来的状态是买家已付款，等待卖家发货，那么这笔交易买家是用担保交易方式付款的
       * 如果商户网站中目前的状态是等待买家付款，而从支付宝通知获取来的状态是交易完成，那么这笔交易买家是用即时到帐方式付款的
       */
      public function notify_url()
      {
            require_once(dirname(__FILE__)."/alipay/alipay_notify.class.php");
            //计算得出通知验证结果
            $alipayNotify = new AlipayNotify($this->alipay_config);
            $verify_result = $alipayNotify->verifyNotify();

            if($verify_result) {
                  $out_trade_no    = $_POST['out_trade_no'];     //获取订单号
                  $trade_no        = $_POST['trade_no'];         //获取支付宝交易号
                  $trade_status    = $_POST['trade_status'];     //交易状态

                  switch ($_POST['trade_status']) {
                        case 'WAIT_BUYER_PAY':
                              //该判断表示买家已在支付宝交易管理中产生了交易记录，但没有付款
                              $status=1;
                              break;
                        case 'WAIT_SELLER_SEND_GOODS':
                              //该判断表示买家已在支付宝交易管理中产生了交易记录且付款成功，但卖家没有发货
                              $status=2;
                              break;
                        case 'WAIT_BUYER_CONFIRM_GOODS':
                              //该判断表示卖家已经发了货，但买家还没有做确认收货的操作
                              $status=3;
                              break;
                        case 'TRADE_FINISHED':
                              //该判断表示买家已经确认收货，这笔交易完成
                              $status=4;
                              break;
                        
                        default:
                              $status=5;
                              break;
                  }

                  /*
                  验证成功时必须在模块中输入以下结果
                  echo "success";
                  */
                  $_POST['status']=$status;
                  return $_POST;

            } else {
                  /*
                  验证失败是必须在模块中输入以下结果
                  echo "fail";
                  */
                  return false;
            }
      }

      /* * 
       * 功能：支付宝页面跳转同步通知页面
       * 版本：3.3
       * 日期：2012-07-23
       * 说明：
       * 以下代码只是为了方便商户测试而提供的样例代码，商户可以根据自己网站的需要，按照技术文档编写,并非一定要使用该代码。
       * 该代码仅供学习和研究支付宝接口使用，只是提供一个参考。

       *************************页面功能说明*************************
       * 该页面可在本机电脑测试
       * 可放入HTML等美化页面的代码、商户业务逻辑程序代码
       * 该页面可以使用PHP开发工具调试，也可以使用写文本函数logResult，该函数已被默认关闭，见alipay_notify_class.php中的函数verifyReturn
       */

      public function return_url()
      {
            require_once(dirname(__FILE__)."/alipay/alipay_notify.class.php");
            unset($_GET['_action']);
            unset($_GET['_module']);
            //计算得出通知验证结果
            $alipayNotify = new AlipayNotify($this->alipay_config);
            $verify_result = $alipayNotify->verifyReturn();
            
            if($verify_result) {
                  $out_trade_no    = $_GET['out_trade_no'];     //获取订单号
                  $trade_no        = $_GET['trade_no'];         //获取支付宝交易号
                  $trade_status    = $_GET['trade_status'];     //交易状态

                  switch ($_GET['trade_status']) {
                        case 'WAIT_SELLER_SEND_GOODS':
                              //该判断表示买家已在支付宝交易管理中产生了交易记录且付款成功，但卖家没有发货
                              $status=1;
                              break;
                        case 'TRADE_FINISHED':
                              //该判断表示买家已经确认收货，这笔交易完成
                              $status=2;
                              break;
                        default:
                              $status=$_GET['trade_status'];
                              break;
                  }

                  //交易成功
                  $_GET['status']=$status;
                  return $_GET;
                  

            } else {
                  //验证失败
                  //如要调试，请看alipay_notify.php页面的return_verify函数，比对sign和mysign的值是否相等，或者检查$veryfy_result有没有返回true
                  return false;
            }
      }




}
?>